package ai

import "math/rand"

type ZobristCache struct {
	size     int
	hash     uint64
	zobRepoB *TypeRepo[uint64]
	zobRepoW *TypeRepo[uint64]
}

func NewZobristCache(size int) *ZobristCache {
	repo1 := NewTypeRepo[uint64](size)
	repo2 := NewTypeRepo[uint64](size)
	for x := 0; x < size; x++ {
		for y := 0; y < size; y++ {
			repo1.Put(x, y, rand.Uint64())
			repo2.Put(x, y, rand.Uint64())
		}
	}

	return &ZobristCache{
		size:     size,
		hash:     0,
		zobRepoB: repo1,
		zobRepoW: repo2,
	}
}

func (z *ZobristCache) TogglePiece(x, y int, role TypeRole) {
	var repo *TypeRepo[uint64]
	if role == Chess.WHITE {
		repo = z.zobRepoW
	} else {
		repo = z.zobRepoB
	}
	z.hash ^= repo.Get(x, y)
}

func (z *ZobristCache) GetHash() uint64 {
	return z.hash
}
